package 单例模式;

import java.util.concurrent.CountDownLatch;

/**
 * 单例模式: 确保某一个类只有一个实例，而且自行实例化并向整个系统提供这个实例
 *
 * 懒汉模式: 在类加载时，不创建实例，因此类加载速度快，但运行时获取对象的速度慢
 * 饿汉模式: 在类加载时就完成了初始化，所以类加载较慢，但获取对象的速度快
 */
public class Test {

    public static void main(String[] args) {
        // 懒汉模式测试
        // 使用CountDownLatch，使用await()等待锁释放，使用countDown()释放锁从而达到并发的效果
        final CountDownLatch latch = new CountDownLatch(1);
        int threadCount = 200;
        for (int i = 0; i < threadCount; i++) {
            new Thread() {
                @Override
                public void run() {
                    try {
                        latch.await();
                    } catch (InterruptedException e) {
                        e.printStackTrace();
                    }
                    System.out.println(DogSingle.getInstance().hashCode());
                }
            }.start();
        }
        latch.countDown();
    }
}
